package cn.jasonone.tio.tcp.commons;

import cn.jasonone.tio.tcp.commons.Command;
import cn.jasonone.tio.tcp.handler.CommandHandler;
import cn.jasonone.tio.tcp.model.Data;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
import org.tio.core.ChannelContext;

/**
 * 命令工厂
 *
 * @author xujie
 * @version 1.0
 * @date 2022/1/18 12:22
 */
public interface CommandFactory extends CommandRegister {
    Marker MARKER = MarkerFactory.getMarker("COMMAND_FACTORY");

    /**
     * 注册指令处理器
     *
     * @param commandHandler 指令处理器
     * @param replace        如果指令处理器已经注册,是否替换
     * @return 注册成功返回true, 否则返回false
     */
    @Override
    boolean registerCommand(CommandHandler commandHandler, boolean replace) throws Exception;

    /**
     * 注册指令处理器
     *
     * @param commandHandler 指令处理器
     * @return 注册成功返回true, 否则返回false
     */
    @Override
    default boolean registerCommand(CommandHandler commandHandler) throws Exception {
        return this.registerCommand(commandHandler, false);
    }

    /**
     * 获取命令对象
     *
     * @param type
     * @param group
     * @param command
     * @return
     */
    Command getCommand(byte type, int group, int command) throws Exception;

    /**
     * 根据指令获取指令处理器
     *
     * @param command
     * @return
     */
    CommandHandler getCommandHandler(Command command);

    /**
     * 检测指定命令处理器是否存在
     * @param command
     * @return
     */
    boolean hasCommandHandler(Command command);

    /**
     * 处理命令
     *
     * @param data
     * @param channelContext
     */
    void handler(Data data, ChannelContext channelContext) throws Exception;
}
